const Koa = require('koa');
const Router = require('koa-router');
const { koaBody } = require('koa-body'); // 请求体解析中间件
const config = require('./config/config');
const atRegularTime = require("./src/utils/time"); // 定时任务工具
const cors = require("@koa/cors"); // 跨域中间件
const path = require('path'); // 路径处理模块
const { Server } = require('socket.io');// Socket.io模块
const http = require('http'); // HTTP模块
const serve = require('koa-static');// 静态资源代理
const gameState = require('./socket/game-state'); // 注意路径


const { initializeDatabase, backupDatabase } = require('./src/db/init'); // 数据库初始化
const { initMapConfig } = require('./config/game');

// 导入jwttoken模块
const { tokenValidator } = require("./src/utils/permission/appRouterPre"); // 导入middleware中的tokenValidator函数

const app = new Koa();
const server = http.createServer(app.callback());// 创建HTTP服务器
// 创建 Socket.IO 服务器
const io = new Server(server);
// Socket.IO 连接
io.on('connection', (socket) => {
    // ✅ 把 io 传进去
    require('./socket/socket-manager').setupSocketHandlers(socket, io);
});
// 配置跨域中间件
app.use(
    cors({
        origin: "*", // 允许所有来源
        // origin: (origin, ctx) => /^http:\/\/127\.0\.0\.1:5500/.test(origin) || !origin ? true : false,
        methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"], // ✅ 加上 OPTIONS
        allowedHeaders: ["Content-Type", "Authorization"], // 允许的请求头
    })
);
// 静态资源代理(前缀为 /uploads)
app.use(serve(path.join(__dirname, '/src/uploads')));

// Swagger相关模块============================================================================
const swaggerJSDoc = require("swagger-jsdoc"); // Swagger文档生成
const { koaSwagger } = require("koa2-swagger-ui"); // Swagger UI界面
// Swagger配置选项
const swaggerOptions = {
    definition: {
        openapi: "3.0.0", // OpenAPI版本
        info: {
            title: "Koa API", // API标题
            version: "1.0.0", // API版本
            description: "Koa API documentation", // API描述
        },
        // ===== 新增安全配置 =====
        components: {
            securitySchemes: {
                BearerAuth: {  // 自定义名称（authorization）
                    type: "http", // 安全类型
                    scheme: "bearer", // 安全方案
                    bearerFormat: "JWT", // 令牌格式
                    description: "输入你的 JWT Token（格式：`Bearer <token>`）"
                }
            }
        },
        // ===== 全局启用安全校验（可选） =====
        security: [{
            BearerAuth: []
        }],
        servers: [ // API服务器配置
            { url: `http://192.168.1.6:${process.env.PORT || 3000}` }, // 服务器URL
            { url: `http://localhost:${process.env.PORT || 3000}` } // 服务器URL
        ],
    },
    apis: ["./src/routes/*.js"], // API路由文件路径
};
// 生成Swagger文档规范
const swaggerSpec = swaggerJSDoc(swaggerOptions);
const publicRouter = new Router(); // 没有 prefix
// 配置Swagger UI路由
publicRouter.get(
    "/docs",
    koaSwagger({
        routePrefix: false, // 禁用自动前缀
        swaggerOptions: {
            spec: swaggerSpec, // 使用生成的Swagger文档
        },
        customCss: `.topbar { display: none }`, // 自定义CSS样式
        customSiteTitle: "Koa API Docs", // 自定义文档标题
    })
);
// Swagger相关模块end============================================================================
app.use(tokenValidator); // 使用tokenValidator验证中间件

app.use(koaBody({
    /**
    * multipart: 是否启用 multipart/form-data 解析
    * - true: 启用文件上传支持
    * - false: 禁用文件上传
    */
    multipart: true,
    formidable: {
        uploadDir: path.join(__dirname, '/src/uploads/tmp'), // 文件上传目录
        keepExtensions: true, // 是否保留文件扩展名
        maxFileSize: 200 * 1024 * 1024, // 最大文件大小(100MB)
        multiples: true,// 是否支持多文件上传
        onFileBegin: (name, file) => {
            // 这里可以处理文件开始上传时的逻辑
            console.log(file);
            console.log(`开始上传文件:`);
        }
        // 添加下面这个配置确保能解析非文件字段

    },
    /**
     * formLimit: URL-encoded 表单数据的最大大小
     * - 这里设置为 100mb
     * - 可以是字符串形式(如'100mb')或数字形式(字节数)
     */
    formLimit: '200mb',
    /**
     * jsonLimit: JSON 请求体的最大大小
     * - 这里设置为 100mb
     */
    jsonLimit: '200mb',
    /**
     * textLimit: 纯文本请求体的最大大小
     * - 这里设置为 100mb
     */
    textLimit: '200mb',
    /**
    * 其他可能的 koa-body 配置:
    */
    urlencoded: true, // 是否解析 application/x-www-form-urlencoded
    json: true, // 是否解析 application/json
    text: true, // 是否解析 text/plain
    encoding: 'utf-8', // 请求体编码
    parsedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'], // 需要解析的 HTTP 方法
    // onError: (err, ctx) => {}, // 解析错误的回调函数
    // strict: true // 是否严格模式(只解析配置的类型)
}));

const registerRoutes = require('./src/routes/index.js'); // 统一注册路由
registerRoutes(app);

app.use(publicRouter.routes()).use(publicRouter.allowedMethods());// 不带前缀的公共路由

// 初始化并启动应用
async function startApp() {
    try {
        await initializeDatabase(); // ✅ 初始化数据库
        // await backupDatabase() // 如果是备份则需要注释掉初始化
        // ✅ 第一步：初始化地图配置（从 DB -> Redis）
        await initMapConfig();
        // ✅ 第二步：初始化游戏状态（依赖 MAPS 已填充）
        await gameState.init();
        // ✅ 第三步：启动定时任务
        atRegularTime();
        // 启动服务器
        server.listen(config.port, () => {
            console.log(`服务启动监听端口：http://localhost:${config.port}`);
            console.log('Swagger: http://localhost:' + config.port + '/docs'); // 打印Swagger文档地址
            // 获取我的ip地址并打印测试环境地址
            const ip = require('ip').address();
            console.log('测试页面:http://' + ip + ':' + config.port + '/index.html'); //
        });
    } catch (error) {
        console.error('Failed to start application:', error);
        process.exit(1);
    }
}

startApp();